package org.dicr.util.jds.gui;

import java.awt.*;

import javax.swing.*;

import org.dicr.event.*;
import org.dicr.gui.*;
import org.dicr.gui.layout.*;

import com.borland.dbswing.*;
import com.borland.dx.dataset.*;

/***********************************************************************************************************************
 * @author Igor A Tarasov me@dicr.dn.ua
 * @version 021025
 **********************************************************************************************************************/
public class DataDetailFields extends JPanel implements DataSetAware, Editable {
	private static final long serialVersionUID = 1L;

	private DataSet dataset = null;

	private boolean editable = true;

	/*******************************************************************************************************************
	 * Конструктор
	 ******************************************************************************************************************/
	public DataDetailFields() {
		try {
			jbInit();
		} catch (Exception ex) {
			DicrExceptionHandler.handleException(ex, this);
		}
	}

	/*******************************************************************************************************************
	 * Инициализация
	 ******************************************************************************************************************/
	private void jbInit() {
		this.setLayout(new PnutsLayout(2, 2, 0));
	}

	/*******************************************************************************************************************
	 * Обновляет структуру при смене источника данных
	 ******************************************************************************************************************/
	protected void updateModel() {
		try {
			Component[] components = this.getComponents();
			if (components != null) {
				for (int i = 0; i < components.length; i++) {
					Component comp = components[i];
					if ((comp != null) && (comp instanceof DataSetAware)) ((DataSetAware) comp).setDataSet(null);
				}
			}
			this.removeAll();
			if (isValidDataSetState()) {
				Column[] cols = this.dataset.getColumns();
				if (cols != null) {
					for (int i = 0; i < cols.length; i++) {
						Column col = cols[i];
						if (col != null && this.dataset.columnIsVisible(col.getColumnName())) {
							JLabel label = new JLabel(col.getColumnName());
							this.add(label, "halign=left");
							Component comp = null;
							if (col.getPickList() != null) {
								JdbComboBox combo = new JdbComboBox();
								combo.setDataSet(this.dataset);
								combo.setColumnName(col.getColumnName());
								comp = combo;
							} else if (col.getDataType() == Variant.DATE) {
								DataDateField date = new DataDateField();
								date.setDataSet(this.dataset);
								date.setColumnName(col.getColumnName());
								comp = date;
							} else if (col.getDataType() == Variant.BOOLEAN) {
								JdbCheckBox checkBox = new JdbCheckBox();
								checkBox.setDataSet(this.dataset);
								checkBox.setColumnName(col.getColumnName());
								comp = checkBox;
							} else {
								JdbTextField text = new JdbTextField();
								text.setColumns(20);
								text.setDataSet(this.dataset);
								text.setColumnName(col.getColumnName());
								comp = text;
							}
							this.add(comp, "halign=fill, expand=x");
						}
					}
				}
			}
			this.revalidate();
		} catch (Exception ex) {
			DicrExceptionHandler.handleException(ex, this);
		}
	}

	/*******************************************************************************************************************
	 * Установка признака редактируемости
	 ******************************************************************************************************************/
	@Override
    public void setEditable(boolean theEditable) {
		if (this.editable != theEditable) {
			this.editable = theEditable;
			Component[] components = this.getComponents();
			if (components != null) {
				for (int i = 0; i < components.length; i++) {
					Component comp = components[i];
					if (comp != null) comp.setEnabled(theEditable);
				}
			}
		}
	}

	/*******************************************************************************************************************
	 * Возвращает признак редактируемости
	 ******************************************************************************************************************/
	@Override
    public boolean isEditable() {
		return this.editable;
	}

	/*******************************************************************************************************************
	 * Проверяет состояние источника данных
	 ******************************************************************************************************************/
	protected boolean isValidDataSetState() {
		return (this.dataset != null && this.dataset.isOpen());
	}

	/*******************************************************************************************************************
	 * Установка источника данных
	 ******************************************************************************************************************/
	@Override
    public void setDataSet(DataSet theDataset) throws DataSetException {
		if (this.dataset != theDataset) {
			this.dataset = theDataset;
			if (this.dataset != null) this.dataset.open();
			updateModel();
		}
	}

	/*******************************************************************************************************************
	 * Возвращает источник данных
	 ******************************************************************************************************************/
	@Override
    public DataSet getDataSet() {
		return this.dataset;
	}
}
